privateGPT MCP Server
by Fujitsu-AI
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class MCPEditUserClient {
public static void main(String[] args) {
// Kurze Validierung der Argumente
if (args.length < 8) {
System.out.println("Usage: " +
"--server-ip <IP> " +
"--server-port <PORT> " +
"--token <TOKEN> " +
"--user-id <USER_ID> [weitere optionale Parameter]");
return;
}
// Argumente auslesen
String serverIp = getArgument(args, "--server-ip");
String portString = getArgument(args, "--server-port");
if (serverIp == null || portString == null) {
System.err.println("Server-IP oder Server-Port fehlt!");
return;
}
int serverPort = Integer.parseInt(portString);
String token = getArgument(args, "--token");
String userId = getArgument(args, "--user-id");
// Optional
String name = getArgument(args, "--name");
String email = getArgument(args, "--email");
String password = getArgument(args, "--password");
String language = getArgument(args, "--language");
String timezone = getArgument(args, "--timezone");
List<String> roles = getListArgument(args, "--roles");
List<String> groups = getListArgument(args, "--groups");
boolean usePublic = Arrays.asList(args).contains("--usePublic");
boolean activateFtp = Arrays.asList(args).contains("--activateFtp");
String ftpPassword = getArgument(args, "--ftpPassword");
// Argumente in eine Map packen
Map<String, Object> argumentsMap = new HashMap<>();
argumentsMap.put("userId", userId);
argumentsMap.put("name", name);
argumentsMap.put("email", email);
argumentsMap.put("password", password);
argumentsMap.put("language", language);
argumentsMap.put("timezone", timezone);
argumentsMap.put("roles", roles);
argumentsMap.put("groups", groups);
argumentsMap.put("usePublic", usePublic);
argumentsMap.put("activateFtp", activateFtp);
argumentsMap.put("ftpPassword", ftpPassword);
// Null oder leere Strings entfernen
argumentsMap = removeNullOrEmpty(argumentsMap);
// JSON-Payload zusammenstellen
JSONObject payload = new JSONObject();
payload.put("command", "edit_user");
payload.put("token", token);
payload.put("arguments", argumentsMap);
System.out.println("π€ Sending edit user request...");
String response = sendRequest(serverIp, serverPort, payload.toString());
System.out.println("βοΈ Response from server:");
System.out.println(response);
}
/**
* Liest den Wert eines bestimmten Parameters aus dem Argument-Array.
* Bsp.: "--server-ip" -> "127.0.0.1"
*
* @param args Array mit allen Argumenten
* @param key Name des Arguments, nach dem gesucht wird (z.B. "--server-ip")
* @return Wert des Arguments oder null, falls nicht gefunden
*/
private static String getArgument(String[] args, String key) {
for (int i = 0; i < args.length; i++) {
if (args[i].equals(key) && i < args.length - 1) {
return args[i + 1];
}
}
return null;
}
/**
* Liest mehrere Werte fΓΌr einen Argument-SchlΓΌssel (z.B. "--roles") aus,
* bis ein neues Argument mit "--" beginnt.
*
* @param args Array mit allen Argumenten
* @param key Name des Arguments, nach dem gesucht wird (z.B. "--roles")
* @return Liste der gefundenen Werte, sonst eine leere Liste
*/
private static List<String> getListArgument(String[] args, String key) {
List<String> values = new ArrayList<>();
for (int i = 0; i < args.length; i++) {
if (args[i].equals(key)) {
// Sammle solange, bis ein neues "--" beginnt oder args zu Ende
for (int j = i + 1; j < args.length && !args[j].startsWith("--"); j++) {
values.add(args[j]);
}
break;
}
}
return values;
}
/**
* Entfernt alle EintrΓ€ge, deren Wert null oder ein leerer String ist.
*/
private static Map<String, Object> removeNullOrEmpty(Map<String, Object> original) {
Map<String, Object> cleaned = new HashMap<>();
for (Map.Entry<String, Object> entry : original.entrySet()) {
Object value = entry.getValue();
if (value != null) {
// Wenn String, checke ob leer oder nur Whitespace
if (value instanceof String) {
String str = (String) value;
if (!str.trim().isEmpty()) {
cleaned.put(entry.getKey(), value);
}
} else {
// Keine weitere PrΓΌfung fΓΌr Listen, Booleans, etc.
cleaned.put(entry.getKey(), value);
}
}
}
return cleaned;
}
/**
* Sendet den gegebenen JSON-String per TCP an den Server und empfΓ€ngt die Antwort.
*
* @param serverIp IP des Servers
* @param serverPort Port des Servers
* @param payload JSON-String
* @return Antwort als String oder Fehlermeldung
*/
private static String sendRequest(String serverIp, int serverPort, String payload) {
try (Socket socket = new Socket(serverIp, serverPort)) {
// Daten zum Server senden
OutputStream output = socket.getOutputStream();
byte[] data = payload.getBytes(StandardCharsets.UTF_8);
output.write(data);
output.flush();
// Antwort lesen
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)
);
StringBuilder sb = new StringBuilder();
char[] buffer = new char[4096];
int charsRead;
do {
charsRead = reader.read(buffer, 0, buffer.length);
if (charsRead > 0) {
sb.append(buffer, 0, charsRead);
}
} while (charsRead == buffer.length);
return sb.toString();
} catch (Exception e) {
return "Error: " + e.getMessage();
}
}
}